// 第一步 初始化我们的包 
//第二步搭建服务器
//引入http
const http = require('http')
const app = http.createServer();

//解析post 请求数据 
const querystring = require('querystring')
//解析get 传递过来的数据 
const url = require('url')
var modfiyId = ''
//第三步连接我们的数据库 
// 引入mongoose  来连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', {
        useUnifiedTopology: true,
        useNewUrlParser: true
    })
    .then(() => {
        console.log('数据库连接成功');
    }).catch(err => console.log(err, '数据库连接失败'))

//创建集合规则
const myinfor = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        minlength: [2, '最小值不能少于2个字符'],
        maxlength: [100, '最大值不能超过100个字符']

    },
    age: {
        type: Number,
        min: [5, '年龄不能低于5'],
        max: [10000, '年龄最大不能超过10000']

    },
    sex: String,
    email: String,
    hobbies: [String],
    collage: String,
    enterDate: {
        type: Date,
        default: Date.now
    }

})
//调用创建集合规则进行创建集合名字
const myInfor = mongoose.model('Myinfor', myinfor)


//1 安装模板引擎 art-template   npm i art-template 
//2 引入  art-template  
const template = require('art-template')
// 引入path 模块
const path = require('path')
//配置一下根路径 
template.defaults.root = path.join(__dirname, 'views')
/*
格式化时间  
1 安装 第三方模块  npm i dateformat 
2 引入 dateformat
3 自定义格式化方法名字
*/
const dateFormat = require('dateformat')
template.defaults.imports.myformat = dateFormat



/*静态资源托管  一般我们需要托管是第三方的 css less img  
// 托管css
// 1 安装   npm install serve-static
// 2 引入   serve-static
// 3 使用 serve-static的返回值进行静态资源托管
// 4  把托管后的返回值挂载在服务器上
*/
const serveStatic = require('serve-static')
//进行静态资源托管
const serve = serveStatic(path.join(__dirname, 'public'))





//实现node js路由功能(调用第三方模块  首先是安装  router    npm i router)
// 最开始是安装router  npm i router 
// 1 引入router  
const Router = require('router')
// 2 调用我们的这个返回值 也就是我们这里的Router
const router = Router()
// 3  测试路由功能(监听路由 ) 
router.get('/list', async (req, res) => {
    //list 路由   
    /*
    get  /list 路由  
    1 从数据库里面读取数据  find 
    2 把读取到的数据采用 模板引擎展示出来 
     */

    let allData = await myInfor.find({})
    console.log(allData); //数组 
    //把数组包装成对象
    let obj = {
        myallData: allData
    }
    let html = template('list.art', obj)

    res.end(html)
})

router.get('/add', (req, res) => {
    //get 请求 进入到/add 这个路由的时候需要加载我们添加数据页面
    //    template('第一个参数是需要加载的模板路径','第二个参数是我们需要加载的数据')

    let html = template('index.art', {})

    res.end(html)
})

// get 提交 req.url
// post 提交  特别是表单提交 一定要有name 属性
//表单提交数据 进行post请求   路由来监听post  /add 这个路由 
router.post('/add', (req, res) => {
    // post 请求提交数据 我们怎么样获取post提交过来的参数 
    // 请求的时候两个方法 一个是正在传输数据data 一个是传输完毕之后触发的end
    let formData = ''
    req.on('data', (params) => {
        formData += params
    })
    req.on('end', async () => {
        // console.log(formData);
        let data = querystring.parse(formData)
        console.log(data);
        //向我们的数据库里面添加添加数据
        //写法一
        /*  myInfor.create(data).then(res => {
            console.log(res);

        })
 */
        //写法二 
        let scuessData = await myInfor.create(data)
        // console.log(scuessData);
    })

    //跳转到/list 路由 // 301 重定向到/list
    res.writeHead(301, {
        Location: '/list'
    })

    res.end()
})

//4.删除功能 
router.get('/remove', async (req, res) => {
    /*
     * 1 获取当前传递过来的id  
     * 2 根据id 去数据库里面查询 找到对应的进行删掉
     * 3  重新跳转到/list 路由
     */
    let myid = url.parse(req.url, true).query.id
    // console.log(myid);
    let delData = await myInfor.findOneAndDelete({
        _id: myid
    })

    // console.log(delData);  
    //重定向完了之后 必须要加上res.end()
    res.writeHead(301, {
        Location: '/list'
    })
    res.end()
})



//5.修改功能 更新功能 
//1 第一部 把之前的值进行渲染
router.get('/modify', async (req, res) => {
    /**
     *  修改的时候get 过来需要做的事情
     * 1 获取get 传递过来的id  
     * 2 根据 id  去数据库里面查询对应的数据
     * 3 把查询出来的数据 通过模板引擎 进行展示
     */

    modfiyId = url.parse(req.url, true).query.id
    // console.log(myid);
    //去数据库查询 
    let findData = await myInfor.findOne({
        _id: modfiyId
    })
    // console.log(findData);

    let html = template('index2.art', findData)

    res.end(html)
})

//第二部分就是修改之前 更新新值 
// 修改完数据后提交的时候是post  请求   然后需要采用  post 请求方式获取数据
router.post('/modify', (req, res) => {
    let myid = modfiyId
    console.log(myid);
    let modfiyData = '';
    req.on('data', (params) => {
        modfiyData += params
    })
    req.on('end', async () => {
        let obj = querystring.parse(modfiyData)  //修改完之后的数据
        // console.log(obj);
        //更新数据库 
        let modfiyRes = await myInfor.updateOne({
            _id: myid
        }, obj)

        res.writeHead(301, {
            Location: '/list'
        })
        res.end()
    })
})











app.on('request', (req, res) => {
    // 4  路由进行挂载 需要挂载在服务器上                     
    router(req, res, () => { //回调函数必须要写 可以什么都不触发但是必须要有这个函数
        // console.log('路由触发了');
    })
    serve(req, res, () => { //这个函数必须要有可以什么都不写
        // console.log('css静态资源托管');
    })
    // res.end('ok')
})
app.listen(8888, () => {
    console.log('http://localhost:8888');

})